package notes.java.concurrent;

import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 	演示线程池
 * 	单一线程池，各任务按顺序逐一执行
 * 	其它线程池，各任务是无序的
 * @author wangcs
 *
 */
public class U13_TestExecutors {

	public static void main(String[] args) {
		// 创建一个单一线程池
		ExecutorService executor = Executors.newSingleThreadExecutor();
		// 创建10个任务
		for(int i=0; i<10; i++) {
			int threadNum = i;
			executor.execute(()->{
				System.out.println("单一线程池---" + threadNum); // 执行结果有按顺序的
			});
		}
		// 创建一个缓存线程池
		ExecutorService executor2 = Executors.newCachedThreadPool();
		// 创建10个任务
		for(int i=0; i<10; i++) {
			int threadNum = i;
			executor2.execute(()->{
				System.out.println("缓存线程池--- " + threadNum); // 执行结果是无序的
			});
		}
		// 创建一个固定大小的线程池
		ExecutorService executor3 = Executors.newFixedThreadPool(5);
		// 创建10个任务
		for(int i=0; i<10; i++) {
			int threadNum = i;
			executor3.execute(()->{
				System.out.println("固定大小的线程池---" + threadNum); // 执行结果是无序的
			});
		}
		// 创建一个调度线程池，延迟10秒后执行
		ScheduledExecutorService executor4 = Executors.newScheduledThreadPool(5);
		// 创建10个任务
		for(int i=0; i<10; i++) {
			int threadNum = i;
			executor4.schedule(()->{
				System.out.println("调度线程池---" + threadNum);
			}, 10, TimeUnit.SECONDS);
		}
		// 创建一个调试线程池，延迟3秒后，每隔1秒执行一次
		ScheduledExecutorService executor5 = Executors.newScheduledThreadPool(5);
		// 创建1个任务
		executor5.scheduleAtFixedRate(()->{
			System.out.println("定时执行---" + new Date());
		}, 3, 1, TimeUnit.SECONDS);
	
		executor.shutdown();
		executor2.shutdown();
		executor3.shutdown();
		executor4.shutdown();
	}
}
